/*
 * @Author jiangzhiwei
 * @Date 2023-07-22 15:24:56
 * @LastEditors jiangzhiwei
 * @LastEditTime 2023-07-31 02:36:38
 * @FilePath \test-cron\src\components\yc-cron\utils\config.js
 * @Description 一些默认配置信息相关
 */

import { LINUX_TYPE, QUARTS_TYPE, QUARTS_WEEK_MAP, SPRING_WEEK_MAP } from "./constant"

/** 表达式各个子项的默认名称 */
export const DEFAULT_EXPRESSION_CATEGORY_NAMES = ['秒', '分', '时', '日', '月', '周', '年']

/** 通用时间（秒/分钟/小时/月）描述 */
export const DEFAULT_TIME_DESCRIPTIONS = [
  '每{category}执行',
  '从第 {slot} {category}到第 {slot} {category}，每{category}执行',
  '从第 {slot} {category}开始，每 {slot} {category}执行',
  '指定哪几{category}执行'
]

/** 日描述 */
export const DEFAULT_DAY_DESCRIPTIONS = [
  '每{day}执行',
  '每{month}从第 {slot} {day}到第 {slot} {day}，每{day}执行',
  '每{month}从第 {slot} {day}开始，每 {slot} {day}执行',
  '距离每{month}第 {slot} {day}最近的那个工作日。不跨{month}',
  '每{month}最后一{day}',
  '指定每{month}哪几{day}执行',
  '不指定{day}，即受{week}影响。不能与{week}同时不指定'
]

/** 周描述 */
export const DEFAULT_WEEK_DESCRIPTIONS = [
  '每{week}执行',
  '每{week}从{week} {slot} 到{week} {slot} ，每日执行',
  '每{week}从{week} {slot} 开始，每 {slot} {day}执行',
  '每{month}第 {slot} 个{week} {slot} 执行',
  '每{month}最后一个{week} {slot} 执行',
  '指定{week}几执行',
  '不指定{week}，即受{day}影响。不能与{day}同时不指定'
]

/** 年描述 */
export const DEFAULT_YEAR_DESCRIPTIONS = [
  '每年执行',
  '从 {slot} 年到 {slot} 年，每年执行',
  '从 {slot} 年开始，每 {slot} 年执行',
  '指定哪几年执行',
  '不指定年，即每年执行'
]

/**
 * @Author jiangzhiwei
 * @Date 2023-07-22 15:53:58
 * @Description 解析配置项
 * @param {Array} config 配置项
 * @param {object} param 配置项中所需参数
 * @return {Array}
 */
export function parseConfig (config, param = {}) {
  if (Array.isArray(config)) { // 如果是数组
    return config.reduce((arr, item) => {
      // 替换param中的所有属性
      Object.entries(param).forEach(entry => {
        item = item.replace(new RegExp(`{\\s*${entry[0]}\\s*}`, 'g'), entry[1])
      })
      const arr2 = item.split(`{slot}`) // 拆分成数组
      arr.push(arr2)
      return arr
    }, [])
  } else {
    return config
  }
}

/**
 * @Author jiangzhiwei
 * @Date 2023-07-23 19:55:56
 * @Description 获取周的值与名称的映射
 * @param {'linux' | 'spring' | 'quarts'} type
 * @return {object}
 */
export function getWeekMap (type) {
  return type === QUARTS_TYPE ? QUARTS_WEEK_MAP : SPRING_WEEK_MAP
}

/**
 * @Author jiangzhiwei
 * @Date 2023-07-31 02:14:57
 * @Description 获取一周的第一天（周日）的值。linux和spring是0，quarts是1
 * @param {'linux' | 'spring' | 'quarts'} type
 * @return {number}
 */
export function getStartDayValueOfWeek (type) {
  return type === QUARTS_TYPE ? 1 : 0
}

/**
 * @Author jiangzhiwei
 * @Date 2023-07-28 10:39:15
 * @Description 根据类型获取可配置项范围序号
 * @param {'linux' | 'spring' | 'quarts'} type
 * @return {Array<number>} [起序号, 止序号]
 */
export function getOptionDuration (type) {
  const startIndex = type === LINUX_TYPE ? 1 : 0 // linux没有秒
  const finishIndex = type === QUARTS_TYPE ? 7 : 6 // linux/spring没有年
  return [startIndex, finishIndex]
}